﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MvcMusicStore.Models;

namespace Repositories.Models
{
    public class ShoppingCart
    {
        private const string ShoppingCartIdKey = "CartId";

        public static Cart GetCart(Controller controller)
        {
            if (controller.Session[ShoppingCartIdKey] == null)
            {
                if (!string.IsNullOrWhiteSpace(controller.User.Identity.Name))
                {
                    controller.Session[ShoppingCartIdKey] = controller.User.Identity.Name;
                }
                else
                {
                    Guid anoCartId = Guid.NewGuid();
                    controller.Session[ShoppingCartIdKey] = anoCartId.ToString();
                }
            }
            // ở đây luôn có cartID
            var shoppingCartId = controller.Session[ShoppingCartIdKey].ToString();
            // trả ra cart theo shoppingCartId
            var cart = RepositoryProvider.CartRepository.GetByShoppingCartId(shoppingCartId);
            if (cart == null)
            {
                cart = new Cart { ShoppingCartId = shoppingCartId };
                RepositoryProvider.CartRepository.Add(cart);
                RepositoryProvider.SaveChanges();
            }
            return cart;
        }

        public static int AddToCart(int cartId, int albumId)
        {
            var album = RepositoryProvider.AlbumRepository.GetById(albumId);
            if (album != null)
            {
                var cartItems = RepositoryProvider.CartItemRepository.GetByCartId(cartId);
                foreach (var cartItem in cartItems)
                {
                    if (cartItem.AlbumId == albumId)
                    {
                        cartItem.Count++;
                        break;
                    }
                }

                if (cartItems.All(s => s.AlbumId != albumId))
                {
                    RepositoryProvider.CartItemRepository.Add(new CartItem { AlbumId = albumId, CartId = cartId, Count = 1, DateCreated = DateTime.Now });
                }
                return RepositoryProvider.SaveChanges();
            }
            else
            {
                return 1;
            }
        }

        public static int RemoveFromCart(int cartId, int albumId)
        {
            var cartItems = RepositoryProvider.CartItemRepository.GetByCartId(cartId);
            foreach (var cartItem in cartItems)
            {
                if (cartItem.AlbumId == albumId)
                {
                    if (cartItem.Count == 1)
                    {
                        RepositoryProvider.CartItemRepository.Delete(cartItem.CartItemId);
                    }
                    else
                    {
                        cartItem.Count--;
                    }
                }
            }
            return RepositoryProvider.SaveChanges();
        }

        public static int EmptyCart(int cartId)
        {
            var cartItems = RepositoryProvider.CartItemRepository.GetByCartId(cartId);
            cartItems.ForEach(s => RepositoryProvider.CartItemRepository.Delete(s.CartItemId));
            return RepositoryProvider.SaveChanges();
        }

        public static List<CartItem> GetCartItems(int cartId)
        {
            return RepositoryProvider.CartItemRepository.GetByCartId(cartId);
        }

        public static int GetCount(int cartId)
        {
            var result = 0;
            var cartItems = GetCartItems(cartId);
            cartItems.ForEach(s => result += s.Count);
            return result;
        }

        public static decimal GetTotal(int cartId)
        {
            decimal result = 0;
            var cartItems = GetCartItems(cartId);
            cartItems.ForEach(s => 
            {
                result += RepositoryProvider.AlbumRepository.GetPrice(s.AlbumId);
            });
            return result;
        }
    }
}